package com.dhq.myapp.ui.identity

import android.content.Context
import android.util.Log
import com.dhq.myapp.util.FileUtil
import com.rokid.cxr.client.extend.CxrApi
import com.rokid.cxr.client.extend.listeners.AudioStreamListener
import com.rokid.cxr.client.utils.ValueUtil

/**
 * DESC
 * Created by DHQ on 2025/10/31.
 */
open class RokidVoiceCollector(
    private val context: Context,
    private val onAsrResult: ((text: String) -> Unit)? = null,
    private val onError: ((errorMsg: String) -> Unit)? = null
) {
    private val TAG = "RokidVoiceCollector"
    // 录音流类型（与眼镜端AI助手关联）
    private val STREAM_TYPE = "AI_assistant"
    // 音频编码类型：1=PCM，2=Opus（此处选择PCM，便于ASR处理）
    private val CODEC_TYPE = 1
    // 第三方ASR客户端（需自行集成，此处以示例形式存在）
    private val asrClient = ThirdPartyAsrClient(
        onResult = { asrText -> onAsrResult?.invoke(asrText) },
        onError = { errorMsg -> onError?.invoke(errorMsg) }
    )

    private var filePath = ""

    /**
     * 设置语音保存文件路径
     */
    fun setVoiceFilePath(path:String){
        filePath = path;
    }

    /**
     * 启动语音采集（需在蓝牙连接成功后调用）
     */
    fun startCollect(): Boolean {
        // 1. 检查蓝牙连接状态
        if (!CxrApi.getInstance().isBluetoothConnected) {
            onError?.invoke("蓝牙未连接，无法启动语音采集")
            return false
        }

        // 2. 设置音频流监听器（接收眼镜端录音数据）
        CxrApi.getInstance().setAudioStreamListener(object : AudioStreamListener {
            // 录音流开始回调
            override fun onStartAudioStream(codecType: Int, streamType: String?) {
                Log.d(TAG, "语音采集开始，编码类型：$codecType，流类型：$streamType")
                // 初始化ASR客户端（传入音频参数：PCM、16kHz、单声道等）
                asrClient.init(
                    sampleRate = 16000,
                    channelCount = 1,
                    bitDepth = 16,
                    codecType = codecType
                )
            }

            // 录音数据流回调（核心：接收音频数据并传给ASR）
            override fun onAudioStream(data: ByteArray?, offset: Int, length: Int) {
                if (data == null || length <= 0) {
                    Log.w(TAG, "接收空音频数据，忽略")
                    return
                }
                Log.d(TAG, "接收音频数据：长度=$length 字节")
                // 将音频数据传给ASR客户端（需截取有效数据：从offset开始，长度为length）
                val validData = data.copyOfRange(offset, offset + length)
                FileUtil.writeByteFile(filePath,validData);
//                asrClient.sendAudioData(validData)
            }

            // 录音流结束回调（SDK未明确定义，需结合业务触发停止）
            // 注：实际场景中可通过“长按眼镜AI键”或“手机端停止按钮”触发停止
        })

        // 3. 调用SDK接口开启录音
        val status = CxrApi.getInstance().openAudioRecord(CODEC_TYPE, STREAM_TYPE)
        return if (status == ValueUtil.CxrStatus.REQUEST_SUCCEED) {
            Log.d(TAG, "语音采集启动成功")
            true
        } else {
            val errorMsg = when (status) {
                ValueUtil.CxrStatus.REQUEST_WAITING -> "录音请求等待中，请勿重复调用"
                ValueUtil.CxrStatus.REQUEST_FAILED -> "录音请求失败"
                else -> "未知状态：$status"
            }
            onError?.invoke(errorMsg)
            false
        }
    }

    fun finishCollect(){
        stopCollect();
        //调用识别
    }

    /**
     * 停止语音采集
     */
    fun stopCollect() {
        // 1. 停止ASR识别
        asrClient.stop()
        // 2. 调用SDK接口关闭录音
        val status = CxrApi.getInstance().closeAudioRecord(STREAM_TYPE)
        if (status == ValueUtil.CxrStatus.REQUEST_SUCCEED) {
            Log.d(TAG, "语音采集停止成功")
        } else {
            Log.e(TAG, "语音采集停止失败，状态：$status")
        }
        // 3. 移除音频流监听器
        CxrApi.getInstance().setAudioStreamListener(null)



    }

//    /**
//     * 第三方ASR客户端（示例类，需替换为实际ASR SDK）
//     */
//    private class ThirdPartyAsrClient(
//        private val onResult: ((text: String) -> Unit)?,
//    private val onError: ((errorMsg: String) -> Unit)?
//    ) {
//        /**
//         * 初始化ASR（传入音频参数）
//         */
//        fun init(sampleRate: Int, channelCount: Int, bitDepth: Int, codecType: Int) {
//            // 实际ASR初始化逻辑（如百度ASR的init方法）
//            Log.d("AsrClient", "初始化ASR：采样率=$sampleRate，声道数=$channelCount")
//        }
//
//        /**
//         * 发送音频数据给ASR
//         */
//        fun sendAudioData(data: ByteArray) {
//            // 实际ASR发送数据逻辑（如百度ASR的send方法）
//            Log.d("AsrClient", "发送音频数据：长度=${data.size} 字节")
//        }
//
//        /**
//         * 停止ASR并获取结果
//         */
//        fun stop() {
//            // 实际ASR停止逻辑，此处模拟返回识别结果
//            val mockResult = "打开提词器并显示欢迎文本" // 模拟ASR识别结果
//            onResult?.invoke(mockResult)
//            Log.d("AsrClient", "ASR识别完成，结果：$mockResult")
//        }
//    }
}